// 传统面向对象
// 类是对象的属性、方法的模板
// class Dog {
//     constructor(type,color){
//         this.type=type;
//         this.color=color;
//     }
//     eat(){
//         console.log('骨头再来一根');
//     }
// }

// js 原型式的面向对象
function Dog(type,color){
    this.type=type;
    this.color=color;
}

// 任何函数都有prototype对象 方法
// Dog.prototype xb smy 有什么关系？
// 共同的实例 共享的方法
// Dog.prototype  {}
Dog.prototype = {
    makeSound :function(){
    console.log(`${this.type} 汪汪汪`);
    },
    eat:function(){
    console.log('骨头再来一根');
  }
}

// 构造函数（属性）  原型对象（方法）  实例
// 1.把构造函数运行了一下
// 2。以new的方式运行 this 指向生成的实例对象
const xb = new Dog('土狗','白色');
const smy = new Dog('萨摩耶','白色');
// xb Dog.prototype有点关系...
console.log(xb.type);
console.log(xb instanceof Dog);
console.log(xb.__proto__.constructor);
// 私有属性
// 任何实例对象都有一个 __proto__ 指向构造函数的prototype对象
console.log(xb.__proto__,'-------');
// xb查找 构造器有没有相应的属性，可以去原型（prototype）对象上查找
// xb.prototype.makeSound();
xb.makeSound();
// 相同的地方
console.log(xb.constructor==smy.constructor)